var ZeroClipboard = {
	version: "1.0.7",
	clients: {},
	moviePath: '/web/lib/J_copy/ZeroClipboard.swf',
	nextId: 1,
	fun: function(thingy) {
		if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
		if (!thingy.addClass) {
			thingy.hide = function() {
				this.style.display = 'none'
			};
			thingy.show = function() {
				this.style.display = ''
			};
			thingy.addClass = function(name) {
				this.removeClass(name);
				this.className += ' ' + name
			};
			thingy.removeClass = function(name) {
				var classes = this.className.split(/\s+/);
				var idx = -1;
				for (var k = 0; k < classes.length; k++) {
					if (classes[k] == name) {
						idx = k;
						k = classes.length
					}
				}
				if (idx > -1) {
					classes.splice(idx, 1);
					this.className = classes.join(' ')
				}
				return this
			};
			thingy.hasClass = function(name) {
				return !!this.className.match(new RegExp("\\s*" + name + "\\s*"))
			}
		}
		return thingy
	},
	setMoviePath: function(path) {
		this.moviePath = path
	},
	dispatch: function(id, eventName, args) {
		var client = this.clients[id];
		if (client) {
			client.receiveEvent(eventName, args)
		}
	},
	register: function(id, client) {
		this.clients[id] = client
	},
	getDOMObjectPosition: function(obj, stopObj) {
		var info = {
			left: 0,
			top: 0,
			width: obj.width ? obj.width : obj.offsetWidth,
			height: obj.height ? obj.height : obj.offsetHeight
		};
		if (obj && (obj != stopObj)) {
			info.left += obj.offsetLeft;
			info.top += obj.offsetTop
		}
		return info
	},
	Client: function(elem) {
		this.handlers = {};
		this.id = ZeroClipboard.nextId++;
		this.movieId = 'ZeroClipboardMovie_' + this.id;
		ZeroClipboard.register(this.id, this);
		if (elem) this.glue(elem)
	}
};
ZeroClipboard.Client.prototype = {
	id: 0,
	ready: false,
	movie: null,
	clipText: '',
	handCursorEnabled: true,
	cssEffects: true,
	handlers: null,
	glue: function(elem, appendElem, stylesToAdd) {
		this.domElement = ZeroClipboard.fun(elem);
		var zIndex = 99;
		if (this.domElement.style.zIndex) {
			zIndex = parseInt(this.domElement.style.zIndex, 10) + 1
		}
		if (typeof(appendElem) == 'string') {
			appendElem = ZeroClipboard.fun(appendElem)
		} else if (typeof(appendElem) == 'undefined') {
			appendElem = document.getElementsByTagName('body')[0]
		}
		var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem);
		this.div = document.createElement('div');
		this.div.className = "zclip";
		this.div.id = "zclip-" + this.movieId;
		var style = this.div.style;
		style.position = 'absolute';
		style.left = '' + box.left + 'px';
		style.top = '' + box.top + 'px';
		style.width = '' + box.width + 'px';
		style.height = '' + box.height + 'px';
		style.zIndex = zIndex;
		if (typeof(stylesToAdd) == 'object') {
			for (addedStyle in stylesToAdd) {
				style[addedStyle] = stylesToAdd[addedStyle]
			}
		}
		appendElem.appendChild(this.div);
		this.div.innerHTML = this.getHTML(box.width, box.height)
	},
	getHTML: function(width, height) {
		var html = '';
		var flashvars = 'id=' + this.id + '&width=' + width + '&height=' + height;
		if (navigator.userAgent.match(/MSIE/)) {
			var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
			html += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="' + protocol + 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="100%" height="100%" id="' + this.movieId + '" align="top"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="' + ZeroClipboard.moviePath + '" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="' + flashvars + '"/><param name="wmode" value="transparent"/></object>'
		} else {
			html += '<embed id="' + this.movieId + '" src="' + ZeroClipboard.moviePath + '" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="100%" height="100%" name="' + this.movieId + '" align="top" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="' + flashvars + '" wmode="transparent" />'
		}
		return html
	},
	hide: function() {
		if (this.div) {
			this.div.style.left = '-2000px'
		}
	},
	show: function() {
		this.reposition()
	},
	destroy: function() {
		if (this.domElement && this.div) {
			this.hide();
			this.div.innerHTML = '';
			var body = document.getElementsByTagName('body')[0];
			try {
				body.removeChild(this.div)
			} catch (e) {}
			this.domElement = null;
			this.div = null
		}
	},
	reposition: function(elem) {
		if (elem) {
			this.domElement = ZeroClipboard.fun(elem);
			if (!this.domElement) this.hide()
		}
		if (this.domElement && this.div) {
			var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
			var style = this.div.style;
			style.left = '' + box.left + 'px';
			style.top = '' + box.top + 'px'
		}
	},
	setText: function(newText) {
		this.clipText = newText;
		if (this.ready) {
			this.movie.setText(newText)
		}
	},
	addEventListener: function(eventName, func) {
		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
		if (!this.handlers[eventName]) {
			this.handlers[eventName] = []
		}
		this.handlers[eventName].push(func)
	},
	setHandCursor: function(enabled) {
		this.handCursorEnabled = enabled;
		if (this.ready) {
			this.movie.setHandCursor(enabled)
		}
	},
	setCSSEffects: function(enabled) {
		this.cssEffects = !! enabled
	},
	receiveEvent: function(eventName, args) {
		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
		switch (eventName) {
		case 'load':
			this.movie = document.getElementById(this.movieId);
			if (!this.movie) {
				var self = this;
				setTimeout(function() {
					self.receiveEvent('load', null)
				}, 1);
				return
			}
			if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
				var self = this;
				setTimeout(function() {
					self.receiveEvent('load', null)
				}, 100);
				this.ready = true;
				return
			}
			this.ready = true;
			try {
				this.movie.setText(this.clipText)
			} catch (e) {}
			try {
				this.movie.setHandCursor(this.handCursorEnabled)
			} catch (e) {}
			break;
		case 'mouseover':
			if (this.domElement && this.cssEffects) {
				this.domElement.addClass('hover');
				if (this.recoverActive) {
					this.domElement.addClass('active')
				}
			}
			break;
		case 'mouseout':
			if (this.domElement && this.cssEffects) {
				this.recoverActive = false;
				if (this.domElement.hasClass('active')) {
					this.domElement.removeClass('active');
					this.recoverActive = true
				}
				this.domElement.removeClass('hover')
			}
			break;
		case 'mousedown':
			if (this.domElement && this.cssEffects) {
				this.domElement.addClass('active')
			}
			break;
		case 'mouseup':
			if (this.domElement && this.cssEffects) {
				this.domElement.removeClass('active');
				this.recoverActive = false
			}
			break
		}
		if (this.handlers[eventName]) {
			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
				var func = this.handlers[eventName][idx];
				if (typeof(func) == 'function') {
					func(this, args)
				} else if ((typeof(func) == 'object') && (func.length == 2)) {
					func[0][func[1]](this, args)
				} else if (typeof(func) == 'string') {
					window[func](this, args)
				}
			}
		}
	}
};
